home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland Pascal with Objects 7.0 / TVDEMO.ZIP / ASCIITAB.PAS next >
Pascal/Delphi Source File  |  1992-10-27  |  5KB  |  207 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Vision Demo                            }
  4. {   Copyright (c) 1990 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. unit ASCIITab;
  9.  
  10. {$F+,O+,X+,S-,D-}
  11.  
  12. { Ascii table viewer. See TVDEMO.PAS for an example program
  13.   that uses this unit.
  14. }
  15.  
  16. interface
  17.  
  18. uses Objects, App, Views, Drivers;
  19.  
  20. type
  21.   PTable = ^TTable;
  22.   TTable = object(TView)
  23.     procedure Draw; virtual;
  24.     procedure HandleEvent(var Event:TEvent); virtual;
  25.   end;
  26.  
  27.   PReport = ^TReport;
  28.   TReport = object(TView)
  29.     ASCIIChar: LongInt;
  30.     constructor Load(var S: TStream);
  31.     procedure Draw; virtual;
  32.     procedure HandleEvent(var Event:TEvent); virtual;
  33.     procedure Store(var S: TStream);
  34.   end;
  35.  
  36.   PASCIIChart = ^TASCIIChart;
  37.   TASCIIChart = object(TWindow)
  38.     constructor Init;
  39.   end;
  40.  
  41. const
  42.   AsciiTableCommandBase: Word = 910;
  43.  
  44.   RTable: TStreamRec = (
  45.      ObjType: 10030;
  46.      VmtLink: Ofs(TypeOf(TTable)^);
  47.      Load:    @TTable.Load;
  48.      Store:   @TTable.Store
  49.   );
  50.   RReport: TStreamRec = (
  51.      ObjType: 10031;
  52.      VmtLink: Ofs(TypeOf(TReport)^);
  53.      Load:    @TReport.Load;
  54.      Store:   @TReport.Store
  55.   );
  56.   RASCIIChart: TStreamRec = (
  57.      ObjType: 10032;
  58.      VmtLink: Ofs(TypeOf(TASCIIChart)^);
  59.      Load:    @TASCIIChart.Load;
  60.      Store:   @TASCIIChart.Store
  61.   );
  62.  
  63. procedure RegisterASCIITab;
  64.  
  65. implementation
  66.  
  67. const
  68.   cmCharacterFocused = 0;
  69.  
  70. procedure TTable.Draw;
  71. var
  72.   Buf: TDrawBuffer;
  73.   X, Y: Integer;
  74.   Color: Byte;
  75. begin
  76.   Color := GetColor(6);
  77.   for Y := 0 to Size.Y - 1 do
  78.   begin
  79.     MoveChar(Buf, ' ', Color, Size.X);
  80.     for X := 0 to Size.X - 1 do
  81.       MoveChar(Buf[x], Chr(32 * y + x), Color, 1);
  82.     WriteLine(0, y, Size.X, 1, Buf);
  83.   end;
  84.   ShowCursor;
  85. end;
  86.  
  87. procedure TTable.HandleEvent(var Event:TEvent);
  88. var
  89.   CurrentSpot: TPoint;
  90.  
  91. procedure CharFocused;
  92. begin
  93.   Message(Owner, evBroadcast, AsciiTableCommandBase + cmCharacterFocused,
  94.     Pointer(Cursor.X + 32 * Cursor.Y));
  95. end;
  96.  
  97. begin
  98.   inherited HandleEvent(Event);
  99.   if Event.What = evMouseDown then
  100.   begin
  101.     repeat
  102.       if MouseInView(Event.Where) then
  103.       begin
  104.         MakeLocal(Event.Where, CurrentSpot);
  105.         SetCursor(CurrentSpot.X, CurrentSpot.Y);
  106.         CharFocused;
  107.       end;
  108.     until not MouseEvent(Event, evMouseMove);
  109.     ClearEvent(Event);
  110.   end
  111.   else if Event.What = evKeyDown then
  112.     with Cursor do begin
  113.       case Event.KeyCode of
  114.         kbHome: SetCursor(0,0);
  115.         kbEnd: SetCursor(Size.X - 1, Size.Y - 1);
  116.         kbUp: if Y > 0 then SetCursor(X, Y - 1);
  117.         kbDown: if Y < Size.Y - 1 then SetCursor(X, Y + 1);
  118.         kbLeft: if X > 0 then SetCursor(X - 1, Y);
  119.         kbRight: if X < Size.X - 1 then SetCursor(X + 1, Y);
  120.       else
  121.         SetCursor(ord(Event.CharCode) mod 32, ord(Event.CharCode) div 32);
  122.       end;
  123.       CharFocused;
  124.       ClearEvent(Event);
  125.     end;
  126. end;
  127.  
  128. { TReport }
  129.  
  130. constructor TReport.Load(var S: TStream);
  131. begin
  132.   inherited Load(S);
  133.   S.Read(ASCIIChar, SizeOf(ASCIIChar));
  134. end;
  135.  
  136. procedure TReport.Draw;
  137. var
  138.   Ch: LongInt;
  139.   Color: Byte;
  140.   Buf: TDrawBuffer;
  141.   TempStr: string;
  142. begin
  143.   FormatStr(TempStr, '  Char: %c Decimal: %0#%3d Hex: %0#%02x  ', ASCIIChar);
  144.   WriteStr(0, 0, TempStr, 6);
  145. end;
  146.  
  147. procedure TReport.HandleEvent(var Event: TEvent);
  148. var
  149.   Table: PTable;
  150. begin
  151.   inherited HandleEvent(Event);
  152.   if Event.What = evBroadcast then
  153.     if Event.Command = AsciiTableCommandBase + cmCharacterFocused then
  154.     begin
  155.       ASCIIChar := Event.InfoLong;
  156.       DrawView;
  157.     end;
  158. end;
  159.  
  160. procedure TReport.Store(var S: TStream);
  161. begin
  162.   inherited Store(S);
  163.   S.Write(ASCIIChar, SizeOf(ASCIIChar));
  164. end;
  165.  
  166. constructor TASCIIChart.Init;
  167. var
  168.   R: TRect;
  169.   Control: PVIew;
  170. begin
  171.   R.Assign(0, 0, 34, 12);
  172.   TWindow.Init(R, 'ASCII Chart', wnNoNumber);
  173.   Flags := Flags and not (wfGrow + wfZoom);
  174.   Palette := wpGrayWindow;
  175.  
  176.   R.Grow(-1,-1);
  177.   R.A.Y := R.B.Y - 1;
  178.   Control := New(PReport, Init(R));
  179.   with Control^ do
  180.   begin
  181.     Options := Options or ofFramed;
  182.     EventMask := EventMask or evBroadcast;
  183.   end;
  184.   Insert(Control);
  185.  
  186.   GetExtent(R);
  187.   R.Grow(-1,-1);
  188.   R.B.Y := R.B.Y - 2;
  189.   Control := New(PTable, Init(R));
  190.   with Control^ do
  191.   begin
  192.     Options := Options or ofFramed;
  193.     BlockCursor;
  194.   end;
  195.   Insert(Control);
  196.   Control^.Select;
  197. end;
  198.  
  199. procedure RegisterASCIITab;
  200. begin
  201.   RegisterType(RTable);
  202.   RegisterType(RReport);
  203.   RegisterType(RASCIIChart);
  204. end;
  205.  
  206. end.
  207.